/*

   Класс последовательной памяти на основе перемещения зарядов между конденсаторами накопителя
   работа с памятью разбита на 4 фазы, за которые данные в виде заряда перемещаються на один бит в накопителях
   
    1. "Зануление" буферного заряда конденсаторов C'
    2. Копирование информации через заряд основных конденсаторов C в буферные C'
    3. "Зануление" основного информационного заряда в конденсаторах C
    4. Копирование информации перемещенной в фазе 2 в основные накопители заряда С со смещением в один конденсатор
       Захват состояния входа с размещением информации с него в первом конденсаторе основного накопителя

   Эмуляция одного бита производиться байтом, 0 - '0' (0x30), 1 - '1' (0x31) для удобства отладки 

*/
#ifndef CHARGE_MEM_CLASS
#define CHARGE_MEM_CLASS
#include "cascade.h"

class CHARGE_MEM : public CASCADE
{
	private:
	 CASCADE *IN;			// Вход данных 
	 char *C, *Cbuff;               // Емкости основных и буферных накопителей 
	 int  SIZE;                     // Размер устройства памяти в битах
	 
	public:

	 CHARGE_MEM(int SIZE_MEM);      // Конструктор размещает накопители заряда
	 ~CHARGE_MEM();                 // Деструктор осовобождает занятое накопителями пространство
	 
	 void ClearBuff(void);		    // Фаза очистки буферных емкостей
	 void ClearData(void);          // Фаза очистки основных емкостей
	 void CopyBuff(void);           // Фаза копирования данных как заряда в буфер
	 void CopyData(void);           // Фаза копирования буферного заряда со смещением на один в основной
	 void clk(int phase);           // Тактовый сигнал разбитый на фазы phase
	 void set(int A, char D);       // Для отладки установка любого бита накопителя в заданное значение
	 int Size(void);                // Метод возвращает размер памяти в битах (во избежании публичного доступа к SIZE)

// Метод get наследуеться от класса каскадируемых устройств и должен быть переопределен	для каскадирования регистров памяти
	 char get(void);                // Возвращает значение выхода регистра памяти (последнего конденсатора буфера)

	 void cascade(CASCADE *object); // Каскадирование любого объекта класса CASCADE на вход регистра памяти
	 void show(void);		// Отобразить значение накопителей заряда С в STDIN в виде строки
};

#endif
